package com.saydc.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.saydc.model.EstadoPromocion;
import com.saydc.model.Promocion;
import com.saydc.utils.HibernateUtils;

public class PromocionesDAO {

	private static PromocionesDAO instance;

	public static PromocionesDAO getInstance(){
		if(instance == null){
			instance = new PromocionesDAO();
		}
		return instance;
	}
	
	@SuppressWarnings("unchecked")
	public List<Promocion> getAllPromociones(){
		Session session = HibernateUtils.currentSession();
    	List<Promocion> listaPromociones = (List<Promocion>)session.createQuery("select p from Promocion p").list();
    	return listaPromociones;
    }
	
	@SuppressWarnings("unchecked")
	public List<Promocion> getPromocionesPendientes(){
    	Session session = HibernateUtils.currentSession();
    	Criteria crit = session.createCriteria(Promocion.class)
    												.add(Restrictions.eq("estadoPromocion", EstadoPromocion.getEstadoPromocion(EstadoPromocion.SOLICITADA)));
    	List<Promocion> listaPromocionesPendientes = crit.list();																
    	return listaPromocionesPendientes;
    }
	
	@SuppressWarnings("unchecked")
	public List<Promocion> getPromocionesEmpleado(int idEmpleado) {
		List<Promocion> listaPromociones = null;
		Session session = HibernateUtils.currentSession();
		listaPromociones = (ArrayList<Promocion>)session.createCriteria(Promocion.class)
													.add(Restrictions.eq("empleado.idEmpleado", idEmpleado))
													.add(Restrictions.eq("estadoPromocion", EstadoPromocion.getEstadoPromocion(EstadoPromocion.ACEPTADA)))
													.addOrder(Order.asc("fechaPromocion"))
													.list();
		return listaPromociones;
	}
	
	@SuppressWarnings("unchecked")
	public List<EstadoPromocion> getEstadosPromocion(){
    	List<EstadoPromocion> listaEstodosPromocion = new ArrayList<EstadoPromocion>();
    	Session session = HibernateUtils.currentSession();
    	listaEstodosPromocion = session.createQuery("select e from EstadoPromocion e").list();
    	return listaEstodosPromocion;
    }
	
	public void altaPromocion(Promocion promocion){
		Session session;
		Transaction tx = null;
		try{
			session = HibernateUtils.currentSession();
			tx = session.beginTransaction();
			session.save(promocion);
			tx.commit();
		}catch(Exception e){
			tx.rollback();
			e.printStackTrace();
			//TODO throw una exception mia
			System.out.println("Error al insertar en la base");
		}finally{
			HibernateUtils.closeSession();
		}
	}

	public void updatePromocion(Promocion promocion) {
		Session session;
		Transaction tx = null;
		try{
			session = HibernateUtils.currentSession();
			tx = session.beginTransaction();
			session.update(promocion);
			tx.commit();
		}catch(Exception e){
			tx.rollback();
			e.printStackTrace();
			//TODO throw una exception mia
			System.out.println("Error al insertar en la base");
		}finally{
			HibernateUtils.closeSession();
		}
	}

}
